\documentclass[12pt,a4paper]{article} % 设置正文字体为12pt
\usepackage[T1]{fontenc}
\usepackage{graphicx} % 可以插入图片
\usepackage{subcaption} % 用于使用子图环境
\graphicspath{{./img/}} % 用于设置引用图片的路径，可以使用相对路径
\usepackage{ctex} %用于设置中文可显示
\usepackage{titlesec} % 用于自定义标题格式
\usepackage{setspace} % 用于调整行间距
\usepackage{geometry} % 用于设置文档页边距
\geometry{margin=25mm}
\usepackage{enumitem} % 导入enumitem宏包
% 自定义\caption命令格式，去掉冒号
\usepackage{caption}
% 这里的#1表示 图 ，#2后面的表示图后面的数字，如 图1 ，\hspace{0.5em表如1后面空半个字符再接图名
\DeclareCaptionLabelFormat{mylabel}{#1 #2\hspace{0.5em}}
\captionsetup[figure]{labelformat=mylabel,labelsep=none,font={small,stretch=1.25},justification=centering}
% 设置图号中有章节号，如第三章的图，图3.1
\usepackage{amsmath}
\numberwithin{figure}{section}
% 设置默认中文和英文字体，其他地方与之不同的字体单独设置
\setCJKmainfont{SimSun}
\setmainfont{Times New Roman}
\bibliographystyle{plain} % 设置参考文献风格，这个请百度
%\usepackage{hyperref} %有这个包，点击文中的数字，可以跳转到对应的图表和参考文献
\usepackage{url}
\usepackage{bibspacing} % 加载这个包，参考文献的行间距会默认设置为0

% 小三号黑体居中，段前与段后间距为1.5行
\titleformat{\section}
	{\centering\fontsize{16pt}{\baselineskip}\heiti}
	{\fontsize{16pt}{\baselineskip}\selectfont\arabic{section}}
	{0.5em}
	{}
\titlespacing*{\section}{0pt}{1.5\baselineskip}{1.5\baselineskip}
% 四号黑体居左，段前与段后间距为1.0行
\titleformat{\subsection}
	{\fontsize{14pt}{\baselineskip}\heiti}
	{\fontsize{14pt}{\baselineskip}\selectfont\arabic{section}.\arabic{subsection}}
	{0.5em}
	{}
\titlespacing*{\subsection}{0pt}{1.0\baselineskip}{1.0\baselineskip}
% 小四号黑体居左，段前与段后间距为0.5行
\titleformat{\subsubsection}
	{\fontsize{12pt}{\baselineskip}\heiti}
	{\fontsize{12pt}{\baselineskip}\selectfont\arabic{section}.\arabic{subsection}}
	{0.5em}
	{}
\titlespacing*{\subsubsection}{0pt}{0.5\baselineskip}{0.5\baselineskip}

% 标题前空的太多，通过\vspace{-2cm}强制往上移
\title{\vspace{-2cm} \heiti {基于BP神经网络的\\无人机故障诊断系统研究}}
\author{\normalsize \kaishu {学号：231110201217 \hspace{1em} 姓名：帅华飞}} % \hspace{1em} 学号和姓名中间空1个字符
\date{}

\begin{document}
	% 设置全文行间距为20pt
	\setlength{\baselineskip}{20pt}
	% 将枚举的文字的行间距和缩进设置成与正文一样。itemize表示无序号的罗列项，enumerate表示有序号的罗列项
	\setlist[itemize]{itemsep=0pt, parsep=0pt, partopsep=0pt, topsep=0pt, leftmargin=\parindent}
	\setlist[enumerate]{itemsep=0pt, parsep=0pt, partopsep=0pt, topsep=0pt, leftmargin=\parindent}

	\maketitle
	
	\section*{摘 \quad 要}
	在小型无人机的发展中，智能方法对于解决故障诊断问题至关重要。这些小型无人机的硬件限制要求采用分析冗余，而非传统的硬件冗余方法。为此，一种基于BP（反向传播）算法的机器学习方法被应用于诊断四旋翼飞行器上的故障，这减轻了基于模型的故障分析所需的工作量。在这项研究中，首先模拟了一个四旋翼飞行器的模型，以生成数据和测试设计的算法。使用监督分类方法BP来分类故障和无故障飞行条件以及故障类型。所选特征是陀螺仪和加速度计的测量值以及四旋翼飞行器四个电机的输入。考虑的故障包括各种执行器故障，如锁定位置、有效性丧失、系统完全故障和硬过故障。由于需要标记数据，训练是离线进行的。结果表明，对于模拟测量，BP在二分类中的准确率为96\%，在多类分类中的准确率为95\%。

	\section{引言}
	随着我国无人机制造商和出口商的实力不断提升，加上政府的大力扶持，行业整体呈现出积极向上的态势。在这种积极氛围的推动下，无人机的安全飞行问题越来越受到关注。为了妥善解决这一问题，我们必须采取有效的故障诊断和检测措施。我们选择使用机器学习方法来诊断小型四旋翼飞行器的故障，主要是考虑到机器学习能够避免对整个过程进行复杂建模的必要性。传统的基于模型的方法需要依赖精确的飞行器模型才能进行有效的故障检测，但在小型无人机系统中，由于存在各种不确定性和干扰，且往往缺乏精确模型，这种方法可能会失效。
	
	相比之下，数据驱动方法不需要深入理解系统的内部动态，而是直接利用现有数据来揭示系统的行为特征。在监督学习模式下，我们通常需要先在训练数据中标注出故障案例，然后利用这些数据来进行故障检测。对于那些未标注的故障情况，我们期望得到的结果是正常模式的概率分布，以及可能的故障标签和未知故障的识别。首先，我们通过模拟飞行器模型来生成飞行参数数据，然后根据陀螺仪、加速度计的测量结果和对四旋翼飞行器四个电机的输入，对这些数据进行故障类型或无故障的标注。
	
	显然，可重新配置的控制系统的有效运行，高度依赖于能否成功检测故障或准确估计飞行器的动态状态。如果在这方面失败，不仅会导致性能下降，有时甚至可能引发灾难性的后果。因此，我们始终在寻求一种可靠的故障检测和诊断方法。


	\section{相关工作}
	检测策略主要可以基于两种方法：1）基于模型，2）数据驱动。
	
	基于模型方法的一个缺点是，它们需要飞机的精确模型才能成功检测。
	
	在数据驱动方法中，不需要详细了解系统的内部动态。监督学习通常需要先在训练数据中标记故障案例，然后用于以数据为中心的故障检测\cite{stutz2010data}。在未标记故障的情况下，预期结果将是可用正常模式的概率分布，识别的故障标签和一个可能的未知故障。
	
	在文献\cite{baskaya2019fault}中，作者应用了BP（反向传播）神经网络来检测和诊断固定翼无人机上的执行器故障，并使用了加速度计和陀螺仪读数以及命令的机翼偏转输入，而本研究是针对四旋翼飞行器的，其中不是使用命令偏转，而是使用四个电机的输入作为特征。\cite{eroglu2020autolanding}不断回归飞机执行器健康状况的估计。他们使用了由一维CNN层后跟LSTM层组成的深度学习结构。健康信息嵌入在基于NDI的控制系统内。\cite{sadhu2020onboard}还提出了一种基于深度学习的故障检测和识别方法，使用CNN和LSTM。Sindhwani等人\cite{sindhwani2020unsupervised}在使用高度冗余的垂直起降（VTOL）车辆时，从5000个任务飞行中学习动态估计函数，并使用该函数作为5000个新任务飞行异常的检测器。他们捕捉到了三种不同的异常类型。\cite{freeman2013model}通过使用真实飞行测试收集的数据比较了基于模型和数据驱动的故障检测方法。\cite{keipour2019alfa}做出了一个重要的举措，他们开源了ALFA Flight数据集。此外，在\cite{keipour2019automatic}中，他们展示了他们的数据集对于在线异常检测的良好应用。我们将继续这一举措，开源我们的飞行数据集及相关程序。
	
	\section{飞行测试平台}
	我在ROS的仿真环境Gazebo中使用了Parrot迷你无人机四旋翼飞行器进行飞行模拟。我采用的无人机模型是一种线跟随无人机，该模型来源于\cite{terlizzi2021vision}的开源GitHub仓库。
	
	下面展示了Gazebo中的控制系统模型，该模型包含多种组件，如飞行指挥系统、飞行控制系统、多旋翼模型、环境模型、传感器模型和飞行可视化模块。
	
	为了生成前述故障的数据集，我对飞行控制系统内部进行了修改。

	% \noindent表示顶格写，无缩进
	\noindent A. 反向传播（BP）神经网络
	
	反向传播神经网络是一种广泛应用的监督学习框架。BP神经网络,如图\ref{bp:bp神经网络}，其显著特性包括：
	\begin{enumerate}[label={\arabic*)}]
		\item BP神经网络通过多层节点连接，能够学习和提取数据的复杂特征。
		\item 它能够通过反向传播算法自动调整网络权重，以最小化输出误差。
	\end{enumerate}
	
	在训练了BP神经网络分类器之后，根据分类问题的性质，使用多种不同的指标来评估分类的性能。
	
	关于本工作中使用的性能指标简要提醒：
	\begin{itemize}
		\item 准确率是正确分类点数与总点数之间的比率。
		
		\item 精确度是正确预测故障数与总检测数（真和假）之间的比率。它表示模型在检测到故障时的可靠性。
		
		\item 召回率是正确预测故障数与存在的故障点总数之间的比率。它表示模型在检测故障方面的可靠性。
		
		\item F1分数是精确度和召回率的调和平均值。
		
		\item 混淆矩阵是机器学习分类问题的性能测量，其中输出可以是两个或更多的类别。它是一个表格，有4种不同的预测和实际值的组合（在$n$个类别的情况下，有$n^2$种组合）。
	\end{itemize}
	
	\begin{figure}[htbp]
		\centering
		\includegraphics[width=0.8\textwidth]{bp.pdf}
		\caption{BP反向传播神经网络}
		\label{bp:bp神经网络}
	\end{figure}
	\noindent B. 执行器故障建模
	
	常见的飞机执行器故障情况包括：1) 锁定在原位，2) 围绕配平点浮动，3) 硬过故障，4) 效能丧失。利用滚转、俯仰、偏航和推力扭矩与不同电机施加的输入之间的线性关系，通过改变控制系统生成的命令执行器输入，然后将要得到的结果输出传递给多旋翼飞行器，以此来注入各种类型的故障。
	
	通常，我们希望减少输入特征的数量，以降低建模的计算成本，在某些情况下，通过移除不相关信息来提高模型的性能。最终决定使用一个基本的特征列表展示所提想法的可行性。因此，在没有复杂的特征工程的情况下，直接使用了线性加速度（$axyz$）、角速度（$ωxyz$）和自动驾驶命令输入到四个电机执行器的输入，共计10个特征。
	
	反向传播（BP）神经网络假设所有特征都围绕0中心化，并且具有相同的方差顺序。为了防止特征向量中任何单个属性的主导，通过去除平均值并缩放到单位方差（使用MATLAB中的默认normalize函数）来标准化特征。通过计算训练集中样本的相关统计量，对特征向量的每个属性独立进行居中和缩放。然后存储平均值和标准差，以便在后续的推理预处理阶段使用。

	
	\section{网络模型训练及预测}
	本文旨在利用BP神经网络建立故障诊断模型，并通过测试集验证模型的准确性和泛化能力。BP神经网络是一种按误差反向传播算法训练的多层前馈神经网络，具有较强的非线性映射能力，适用于故障诊断等复杂问题的解决，具体网络结构图如图\ref{bp:bpnet}所示。
	
	\begin{figure}[htbp]
		\centering
		\includegraphics[width=0.2\textwidth]{bp_net.pdf}
		\caption{BP网络构建图}
		\label{bp:bpnet}
	\end{figure}
	
%	\begin{figure}[htbp]
%		\centering
%		\begin{minipage}{0.2\textwidth}   % minipage后定义页面宽度，如60pt
%			\centering
%			\includegraphics[width=\textwidth]{bp_net.pdf}
%			\caption{BP网络\\构建图}
%			\label{bp:bpnet}
%		\end{minipage}
%		\qquad
%		\begin{minipage}{0.6\textwidth}
%			\centering
%			\includegraphics[width=\textwidth]{xingneng.pdf}
%			\caption{BP网络训练性能效果}
%			\label{bp:xingneng}
%		\end{minipage}
%	\end{figure}
	
	首先，从fault\_data\_multiclass.csv文件中读取数据。数据集被分为输入和输出两部分，其中输入为前$n-1$列，输出为最后一列。为了保证模型训练的效果，将数据集随机划分为训练集和测试集，测试集占总数据的10\%。
	
	对训练集输入进行归一化处理，将其映射到[0,1]区间，以减少数值差异对训练过程的影响。同时，对训练集输出进行归一化处理，采用默认区间[-1,1]，以保证输出数据的一致性。测试集输入采用与训练集相同的归一化方式，确保数据分布的一致性。
	
	在训练过程中，设置了多个网络参数，包括训练次数、学习速率和训练目标最小误差。选择了tansig和purelin作为激活函数，其中tansig用于隐含层，purelin用于输出层。采用trainlm作为训练算法，通过遍历隐含层节点数，找到使训练集均方误差最小的最佳隐含层节点数。网络训练性能效果如图\ref{bp:xingneng}所示。
	
	\begin{figure}[htbp]
		\centering
		\includegraphics[width=0.5\textwidth]{xingneng.pdf}
		\caption{BP网络训练性能效果}
		\label{bp:xingneng}
	\end{figure}
	
	利用训练好的模型对测试集进行预测，并将预测结果反归一化。为了评估模型性能，计算了预测值和实际值之间的误差，包括误差平方和、平均绝对误差、均方误差、均方根误差和平均百分比误差。同时，计算预测准确率和相关系数，以全面评估模型的表现。BP训练网络预测值与实际值的对比如图\ref{bp:duibi}所示，测试集的预测误差如图\ref{bp:yucewucha}所示。
	
	为了直观展示模型的预测能力，将预测值和实际值进行可视化展示，并绘制误差曲线，帮助理解误差分布和模型性能。此外，输出测试集的预测结果，包括样本编号、实际值、预测值和误差，为进一步的分析提供数据支持。
	
	\begin{figure}[htbp]
		\centering
		\begin{minipage}{0.4\textwidth}   % minipage后定义页面宽度，如60pt
			\centering
			\includegraphics[width=\textwidth]{duibi.pdf}
			\caption{BP训练预测值与实际值的对比}
			\label{bp:duibi}
		\end{minipage}
		\qquad% 表示空格
		\begin{minipage}{0.4\textwidth}
			\centering
			\includegraphics[width=\textwidth]{yucewucha.pdf}
			\caption{BP网络测试集的预测误差}
			\label{bp:yucewucha}
		\end{minipage}
	\end{figure}
	
	\section{结论}
	通过以上步骤，本文成功建立了基于BP神经网络的故障诊断模型，并通过测试集验证了模型的准确性和泛化能力。具体而言，该模型在故障诊断领域取得了92.20\%的预测准确率，表明其在处理复杂问题时具有较高的可靠性和有效性。
	
	BP神经网络由于其强大的非线性映射能力，在处理故障诊断等复杂问题时表现出色\cite{JMZY202402001}。本文的方法通过精心选择训练参数和优化网络结构，显著提高了模型的性能。同时，通过详尽的误差分析和结果可视化，进一步验证了模型的有效性。
	
	该模型在故障诊断领域具有广泛的应用前景，能够有效地识别和预测故障，减少设备停机时间和维护成本，提升生产效率和安全性。未来的研究可以进一步优化网络结构和训练算法，探索更为复杂和多样的应用场景，充分发挥BP神经网络在故障诊断领域的潜力。
	
	综上所述，本文通过建立和优化BP神经网络模型，成功实现了高效的故障诊断，并通过严谨的验证过程证明了模型的优越性和实用性，为相关领域的研究和应用提供了有价值的参考。
	
	\newpage % 另起一页
	\bibliography{references}   % 将.bib文件中的参考文献放到这个地方

\end{document}